package pl.edu.kolokwium.logic;

import pl.edu.kolokwium.data.PurchasedProduct;
import pl.edu.kolokwium.logic.exceptions.IncorrectValueException;
import pl.edu.kolokwium.logic.interfaces.FileWriterInterface;
import pl.edu.kolokwium.logic.interfaces.ShoppingInterface;
import pl.edu.kolokwium.logic.services.FileWriterService;
import pl.edu.kolokwium.logic.services.ShoppingService;

import java.util.Optional;
import java.util.Scanner;

/**
 * Główna klasa aplikacji zarządzającej listą zakupów.
 * Zawiera interfejs użytkownika i koordynuje działanie innych komponentów.
 */
public class MainApp {
    private static final Scanner scanner = new Scanner(System.in);
    private static final ShoppingInterface shoppingService = new ShoppingService();
    private static final FileWriterInterface<PurchasedProduct> fileWriterService = new FileWriterService<>();

    public static void main(String[] args) {
        boolean running = true;

        while (running) {
            printMenu();
            String choice = scanner.nextLine();

            try {
                switch (choice) {
                    case "1":
                        addProduct();
                        break;
                    case "2":
                        displayProductList();
                        break;
                    case "3":
                        displayProductDetails();
                        break;
                    case "4":
                        displayReport();
                        break;
                    case "5":
                        saveToFile();
                        break;
                    case "6":
                        running = false;
                        System.out.println("Program zakończony.");
                        break;
                    default:
                        System.out.println("Nieprawidłowy wybór. Spróbuj ponownie.");
                }
            } catch (Exception e) {
                System.out.println("Wystąpił błąd: " + e.getMessage());
            }
        }
    }

    private static void printMenu() {
        System.out.println("\n===== MENU ZAKUPÓW =====");
        System.out.println("1. Dodaj produkt do listy");
        System.out.println("2. Wyświetl listę produktów");
        System.out.println("3. Wyświetl szczegóły produktu");
        System.out.println("4. Wyświetl raport");
        System.out.println("5. Zapisz listę produktów do pliku");
        System.out.println("6. Zakończ program");
        System.out.print("Wybierz opcję: ");
    }

    private static void addProduct() {
        try {
            System.out.println("\n--- DODAWANIE NOWEGO PRODUKTU ---");
            System.out.print("Podaj nazwę produktu: ");
            String name = scanner.nextLine();

            System.out.print("Podaj wagę produktu (w gramach, 1-20000): ");
            int weight = Integer.parseInt(scanner.nextLine());

            System.out.print("Podaj cenę za sztukę (0.01-1000 zł): ");
            float price = Float.parseFloat(scanner.nextLine());

            System.out.print("Podaj liczbę sztuk (1-100): ");
            int quantity = Integer.parseInt(scanner.nextLine());

            PurchasedProduct product = new PurchasedProduct(name, weight, price, quantity);
            shoppingService.addProduct(product);
            System.out.println("Produkt dodany pomyślnie!");
        } catch (NumberFormatException e) {
            System.out.println("Nieprawidłowy format liczby. Spróbuj ponownie.");
        } catch (IllegalArgumentException | IncorrectValueException e) {
            System.out.println("Nie można dodać produktu: " + e.getMessage());
        }
    }

    private static void displayProductList() {
        List<Product> products = shoppingService.getShoppingList();
        if (products.isEmpty()) {
            System.out.println("\nLista produktów jest pusta.");
            return;
        }

        System.out.println("\n--- LISTA PRODUKTÓW ---");
        for (int i = 0; i < products.size(); i++) {
            System.out.printf("%d. %s%n", i + 1, products.get(i).getProductName());
        }
    }

    private static void displayProductDetails() {
        System.out.println("\n--- SZCZEGÓŁY PRODUKTU ---");
        System.out.println("1. Wyszukaj po nazwie");
        System.out.println("2. Wyszukaj po numerze");
        System.out.print("Wybierz metodę wyszukiwania: ");
        String searchMethod = scanner.nextLine();

        Optional<Product> product = Optional.empty();

        if ("1".equals(searchMethod)) {
            System.out.print("Podaj nazwę produktu: ");
            String name = scanner.nextLine();
            product = shoppingService.getProductByName(name);
        } else if ("2".equals(searchMethod)) {
            System.out.print("Podaj numer produktu: ");
            try {
                int index = Integer.parseInt(scanner.nextLine()) - 1;
                product = shoppingService.getProductByIndex(index);
            } catch (NumberFormatException e) {
                System.out.println("Nieprawidłowy numer produktu.");
            }
        }

        product.ifPresentOrElse(
                p -> System.out.println("\nSzczegóły produktu:\n" + p),
                () -> System.out.println("Produkt nie został znaleziony.")
        );
    }

    private static void displayReport() {
        System.out.println("\n--- RAPORT ZAKUPÓW ---");
        System.out.println("Liczba produktów: " + shoppingService.getProductCount());
        System.out.printf("Sumaryczna waga: %.2f kg%n", shoppingService.getTotalWeight() / 1000.0);
        System.out.printf("Sumaryczna wartość: %.2f zł%n", shoppingService.getTotalValue());
    }

    private static void saveToFile() {
        if (shoppingService.getProductCount() == 0) {
            System.out.println("Lista produktów jest pusta. Nie ma czego zapisać.");
            return;
        }

        System.out.print("\nPodaj ścieżkę do pliku do zapisu: ");
        String filePath = scanner.nextLine();

        // Rzutowanie listy produktów na listę PurchasedProduct
        @SuppressWarnings("unchecked")
        List<PurchasedProduct> products = (List<PurchasedProduct>) shoppingService.getShoppingList();

        fileWriterService.saveToFile(products, filePath);
        System.out.println("Trwa zapisywanie do pliku w tle...");
    }
}